// !自定义类型保护
const valueList = [123, 'abc'];
const getRandomValue = () => {
  const value = Math.random() * 10; // 这里取一个[0, 10)范围内的随机值
  if (value < 5) { return valueList[0]; } else { return valueList[1]; } // 否则返回"abc"
};
function isString(value: number | string): value is string {
  return typeof value === 'string';
}
const item = getRandomValue();
if (isString(item)) {
  console.log(item.length); // 此时item是string类型
} else {
  console.log(item.toFixed()); // 此时item是number类型
}


// !typeof类型保护
if (typeof item === "string") {
  console.log(item.length);
} else {
  console.log(item.toFixed());
}

// !instanceof类型保护
class CreateByClass1 {
  public age = 18;
  constructor() { }
}
class CreateByClass2 {
  public name = "fish";
  constructor() { }
}
function getRandomItem() {
  return Math.random() < 0.5 ? new CreateByClass1() : new CreateByClass2(); // 如果随机数小于0.5就返回CreateByClass1的实例，否则返回CreateByClass2的实例
}
const item2 = getRandomItem();
if (item2 instanceof CreateByClass1) { // 这里判断item是否是CreateByClass1的实例
  console.log(item2.age); //18
} else {
  console.log(item2.name); //fish
}
